/*
 * jcalculation.java
 *
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
/**
 *
 * @author Kaufmann-Heizenreder
 */
public class Jcalculation_ui{
    //Variables de instancias
    //private JButton [] botonesDeNumeros;
    //private JButton [] botonesDeOperandos;
   
    private JButton cero = new JButton("0");
    private JButton uno = new JButton("1");
    private JButton dos = new JButton("2");
    private JButton tres = new JButton("3");
    private JButton cuatro = new JButton("4");
    private JButton cinco = new JButton("5");
    private JButton seis = new JButton("6");
    private JButton siete = new JButton("7");
    private JButton ocho = new JButton("8");
    private JButton nueve = new JButton("9");
    
    private JButton suma = new JButton("+");
    private JButton resta = new JButton("-");
    private JButton producto = new JButton("*");
    private JButton division = new JButton("/");
    private JButton limpiar = new JButton("CE");
    private JButton igual = new JButton("=");
    private JButton punto = new JButton(".");

    private JTextField display;
    private JPanel superior;
    private JPanel inferior;
    private JRootPane rootPanel;
    private JFrame calculadora;
    private BorderLayout border;
    private String [] operaciones;

    /**
     * Constructor de la aplicacion JCalculation
     * @param None
     */
    public Jcalculation_ui(){
        //String un_titulo = "JCalculation";
        try{
            /*
             * Esto quise sacar hacer con los for para no repetir codigo, pero
             * me mande una :S
            this.operaciones = { "+", "-", "*", "/","CE","=","."};
            for(int i=0; i < 10; i++){
                this.botonesDeNumeros[i] = new JButton(String.valueOf(i));
            }
            for(int i=0; i < 6; i++){
                this.botonesDeOperandos[i] = new JButton(this.operaciones[i]);
            }
            */
            this.display = new JTextField(30);
            this.superior = new JPanel();
            this.inferior = new JPanel();
            this.rootPanel = new JRootPane();
            this.calculadora= new JFrame("JCalculation");
            this.border = new BorderLayout();
            this.inicializar();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    /**
     * Metodo privado mediante el cual inicializamos y agregamos los
     * componentes necesarios al JFrame
     * @param None
     * @trows Exception
     */
    private void inicializar() throws Exception{
        //Panel superior, es el que maneja la entrada de datos.
        this.superior.setLayout(new FlowLayout());
        this.superior.add(this.display);
        //Panel inferior, es el contendra la botonera.
        this.inferior.setLayout(new GridLayout(4,5,1,1));
        /*
         *  ---------------------
         *  |                   |
         *  ---------------------
         *  | 7 | 8 | 9 | / |   |
         *  --------------------|
         *  | 4 | 5 | 6 | * |   |
         *  --------------------|
         *  | 1 | 2 | 3 | - |   |
         *  --------------------|
         *  | 0 | . | = | + | CE|
         *  ---------------------
         *  
         *  Aca me parece 
         * */
        this.inferior.add(this.siete);
        this.inferior.add(this.ocho);
        this.inferior.add(this.nueve);
        this.inferior.add(this.division);
        this.inferior.add(new JButton(":)"));

        this.inferior.add(this.cuatro);
        this.inferior.add(this.cinco);
        this.inferior.add(this.seis);
        this.inferior.add(this.producto);
        this.inferior.add(new JButton(":S"));

        this.inferior.add(this.uno);
        this.inferior.add(this.dos);
        this.inferior.add(this.tres);
        this.inferior.add(this.resta);
        this.inferior.add(new JButton(":[]"));

        this.inferior.add(this.cero);
        this.inferior.add(this.punto);
        this.inferior.add(this.igual);
        this.inferior.add(this.suma);
        this.inferior.add(this.limpiar);
       
        this.ConectarEventos();
        this.calculadora.getContentPane().add(this.superior, BorderLayout.NORTH);
        this.calculadora.getContentPane().add(this.inferior, BorderLayout.CENTER);
        this.calculadora.setSize(350,250);
        this.calculadora.setVisible(true);
        this.calculadora.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    /**
     *  Se encargara de gestionar los eventos, la idea es que al presionar el
     *  boton el valor se valla agregando al JTextField, pero no encuentro en
     *  [1] una funcion que haga esa accion :[],SOLUCIONADO! :) otra que se
     *  me ocurrio recien que en este caso, podemos poner todos los botones en
     *  un Arreglo o Vector para ir recorriendolo y no repetir codigo;
     *  en definitiva todos hacen la misma accion, o no?.
     *  @param None
     *  [1] http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTextField.html
     */
    public void ConectarEventos(){
        //0
        this.cero.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "0";
                display.setText(aux);
                System.out.println("0");
            }
        });

        //1
        this.uno.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "1";
                display.setText(aux);
                System.out.println("1");
            }
        });
        //2
        this.dos.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "2";
                display.setText(aux);
                System.out.println("2");
            }
        });
        //3
        this.tres.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "3";
                display.setText(aux);
                System.out.println("3");

            }
        });
        //4
        this.cuatro.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "4";
                display.setText(aux);
                System.out.println("4");
            }
        });
        //5
        this.cinco.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "5";
                display.setText(aux);
                System.out.println("5");
            }
        });
        //6
        this.seis.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "6";
                display.setText(aux);
                System.out.println("6");
            }
        });
        //7
        this.siete.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "7";
                display.setText(aux);
                System.out.println("7");
            }
        });
        //8
        this.ocho.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "8";
                display.setText(aux);
                System.out.println("8");
            }
        });
        //9
        this.nueve.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "9";
                display.setText(aux);
                System.out.println("9");
            }
        });
        //+
        this.suma.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "+";
                display.setText(aux);
                System.out.println("+");
            }
        });
        //-
        this.resta.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "-";
                display.setText(aux);
                System.out.println("-");
            }
        });
        //*
        this.producto.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "*";
                display.setText(aux);
                System.out.println("*");
            }
        });
        // '/'
        this.division.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + "/";
                display.setText(aux);
                System.out.println("/");
            }
        });
        //.
        this.punto.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String aux = display.getText() + ".";
                display.setText(aux);
                System.out.println(".");
            }
        });

        //CE
        this.limpiar.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                display.setText(null);
                System.out.println("Limpiamos");
            }
        });
        // =
         this.igual.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                // no me deja poner this.display: porque?
                String tux = display.getText();
                System.out.println("Resolvemos");
                resolver(tux);
            }
        });

    }
    /**
     * Funcion que deberia estar en jcalculation/run
     * Se encargara de realizar las operaciones, Mejorar el algoritmo, puede
     * ser mas eficiente ;).
     * Cuando llamo a sumar(indexOf,cadena), esto podemos mejorarlo si
     * almacenamos en una variable el resultado de la funcion. Otro tema a ver
     * es por ejemplo en vez de tener una funcion por cada operacion, es tener
     * una sola funcion que tenga un swich y le pasamos una bandera para
     * determinar el proceso a realizar. 
     * Escucho opiniones.
     * @param cadeda es el String que tomamos del JTextField
     * La funcion indexOf(s) en caso de no encontrar 's' devuelve -1
     */
    public void resolver(String cadena){
        //int aux = cadena.indexOf("+");
        if(cadena.indexOf("+") > 0 ){
            System.out.println("Si: +");
            sumar(cadena.indexOf("+"),cadena);
        }else if(cadena.indexOf("-") > 0){
            System.out.println("Si: -");
            restar(cadena.indexOf("-"),cadena);
        }else if(cadena.indexOf("*") > 0){
            System.out.println("Si: *");
            producto(cadena.indexOf("*"),cadena);
        }else if(cadena.indexOf("/") > 0){
            System.out.println("Si: /");
            division(cadena.indexOf("/"),cadena);
        }else{
            System.out.println("Al menos un operador debes poner :[]");
        }
    }
    /**
     *  Funcion que se encargara de resolver la suma.
     *  @param index Es la posicion de la cadena que se encuentra el +
     *  @param cadena Es el contenido del display
     */
    public void sumar(int index, String cadena){
        //eliminamos los espacios en blanco si los hubiera con trim()
        double numero_1 = Double.valueOf(cadena.substring(0,index).trim()).doubleValue();
        double numero_2 = Double.valueOf(cadena.substring(index+1,cadena.length()).trim()).doubleValue();
        double resultado = numero_1 + numero_2;
        display.setText(String.valueOf(resultado));
    }
     /**
     *  Funcion que se encargara de resolver la resta.
     *  @param args index Es la posicion de la cadena que se encuentra el -
     *  @param args cadena Es el contenido del display
     */
    public void restar(int index, String cadena){
        //eliminamos los espacios en blanco si los hubiera con trim()
        double numero_1 = Double.valueOf(cadena.substring(0,index).trim()).doubleValue();
        double numero_2 = Double.valueOf(cadena.substring(index+1,cadena.length()).trim()).doubleValue();
        double resultado = numero_1 - numero_2;
        display.setText(String.valueOf(resultado));
    }
     /**
     *  Funcion que se encargara de resolver el producto.
     *  @param index Es la posicion de la cadena que se encuentra el *
     *  @param cadena Es el contenido del display
     */
    public void producto(int index, String cadena){
        //eliminamos los espacios en blanco si los hubiera con trim()
        double numero_1 = Double.valueOf(cadena.substring(0,index).trim()).doubleValue();
        double numero_2 = Double.valueOf(cadena.substring(index+1,cadena.length()).trim()).doubleValue();
        double resultado = numero_1 * numero_2;
        display.setText(String.valueOf(resultado));
    }
     /**
     *  Funcion que se encargara de resolver la division.
     *  @param index Es la posicion de la cadena que se encuentra el /
     *  @param cadena Es el contenido del display
     */
    public void division(int index, String cadena){
        //eliminamos los espacios en blanco si los hubiera con trim()
        double numero_1 = Double.valueOf(cadena.substring(0,index).trim()).doubleValue();
        double numero_2 = Double.valueOf(cadena.substring(index+1,cadena.length()).trim()).doubleValue();
        double resultado = numero_1 / numero_2;
        display.setText(String.valueOf(resultado));
    }
     /**
     * Funcion main que se ejecutaria desde jcalculation/run
     * estos es solo de prueba.
     * @param args
     **/

    public static void main(String[] args) {
	    try {
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
      } catch (Exception e) { }
        Jcalculation_ui cal = new Jcalculation_ui();
	}
}
